
<!DOCTYPE html>
<html
  lang="zh-cn"
  data-figures=""
  
    class="page"
  
  
  >
  <head>
<title>嵌入式学习环境快速搭建（二） | 拾月国度</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script>
  var _hmt = _hmt || [];
  (function() {
    var hm = document.createElement("script");
    hm.src = "https://hm.baidu.com/hm.js?c24bad48a3da8c3c532f0c580bb4f8c5";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
</script>





<meta property="og:locale" content="zh-cn" />

<meta property="og:type" content="article">
<meta name="description" content="一键编译、qemu模拟运行" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:creator" content="">
<meta name="twitter:title" content="嵌入式学习环境快速搭建（二）" />
<meta name="twitter:image" content="https://kingdix10.gitee.io/covers/cover8.jpg"/>
<meta property="og:url" content="https://kingdix10.gitee.io/post/dev_env/eel_env/eel_readm/" />
<meta property="og:title" content="嵌入式学习环境快速搭建（二）" />
<meta property="og:description" content="一键编译、qemu模拟运行" />
<meta property="og:image" content="https://kingdix10.gitee.io/covers/cover8.jpg" />

<link rel="apple-touch-icon" sizes="180x180" href="https://kingdix10.gitee.io/icons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://kingdix10.gitee.io/icons/icon_yellow_transparent.png">
<link rel="manifest" href="https://kingdix10.gitee.io/icons/site.webmanifest">

<link rel="canonical" href="https://kingdix10.gitee.io/post/dev_env/eel_env/eel_readm/">



<link rel="preload" href="https://kingdix10.gitee.io/css/styles.42e2c5f6d8cf9c52872666f8d8b2678ad0c426978b9d78aff3c33b7a1e7f6f97f54bcdaf0518a25fb0fe26367d04f8b07c683b3b38b331cb098daadee06b1f3e.css" integrity = "sha512-QuLF9tjPnFKHJmb42LJnitDEJpeLnXiv88M7eh5/b5f1S82vBRiiX7D&#43;JjZ9BPiwfGg7OzizMcsJjare4GsfPg==" as="style" crossorigin="anonymous">



<link rel="preload" href="https://kingdix10.gitee.io/zh-cn/js/bundle.352f6b8ac853443fc909370d968a769ffa303b36042cc66849f2d48d9e5dd951ee86c06130908f5d77ea0e55ec8fed0e5dc26f0f14bbd4ad6dcf35999232e5bc.js" as="script" integrity=
"sha512-NS9rishTRD/JCTcNlop2n/owOzYELMZoSfLUjZ5d2VHuhsBhMJCPXXfqDlXsj&#43;0OXcJvDxS71K1tzzWZkjLlvA==" crossorigin="anonymous">


<link rel="stylesheet" type="text/css" href="https://kingdix10.gitee.io/css/styles.42e2c5f6d8cf9c52872666f8d8b2678ad0c426978b9d78aff3c33b7a1e7f6f97f54bcdaf0518a25fb0fe26367d04f8b07c683b3b38b331cb098daadee06b1f3e.css" integrity="sha512-QuLF9tjPnFKHJmb42LJnitDEJpeLnXiv88M7eh5/b5f1S82vBRiiX7D&#43;JjZ9BPiwfGg7OzizMcsJjare4GsfPg==" crossorigin="anonymous">

  </head>
  <body
    data-code="9"
    data-lines="true"
    id="documentTop"
    data-lang="zh-cn"
  >

<header class="nav_header" >
  <nav class="nav"><a href='https://kingdix10.gitee.io/' class="nav_brand nav_item" title="拾月国度">
  <img src="https://kingdix10.gitee.io/logos/icon_yellow_transparent_72x72.png" class="logo" alt="拾月国度">
  <div class="nav_close">
    <div><svg class="icon">
  <title>open-menu</title>
  <use xlink:href="#open-menu"></use>
</svg>
<svg class="icon">
  <title>closeme</title>
  <use xlink:href="#closeme"></use>
</svg>
</div>
  </div>
</a>

    <div class='nav_body nav_body_left'>
      
      
      
        

  <div class="nav_parent">
    <a href="https://kingdix10.gitee.io/home" class="nav_item" title="主页">主页 </a>
  </div>
  <div class="nav_parent">
    <a href="https://kingdix10.gitee.io/" class="nav_item" title="归档">归档 </a>
  </div>
  <div class="nav_parent">
    <a href="https://kingdix10.gitee.io/" class="nav_item" title="链接">链接 <img src='https://kingdix10.gitee.io/icons/caret-icon.svg' alt="icon" class="nav_icon"></a>
    <div class="nav_sub">
      <span class="nav_child"></span>
        <a href="https://gitee.com/kingdix10" class="nav_child nav_item" title="Gitee">Gitee</a>
        <a href="https://github.com/kingdix10" class="nav_child nav_item" title="GitHub">GitHub</a>
        <a href="https://www.zhihu.com/people/kingdix10" class="nav_child nav_item" title="知乎">知乎</a>
        <a href="https://www.cnblogs.com/kingdix10" class="nav_child nav_item" title="博客园">博客园</a>
        <a href="https://blog.csdn.net/u014001096" class="nav_child nav_item" title="CSDN">CSDN</a>
    </div>
  </div>
  <div class="nav_parent">
    <a href="https://kingdix10.gitee.io/about/" class="nav_item" title="关于">关于 </a>
  </div>
      
      <div class="nav_parent">
        <a href="#" class="nav_item">🌐</a>
        <div class="nav_sub">
          <span class="nav_child"></span>
          
          <a href="https://kingdix10.gitee.io/" class="nav_child nav_item">中文</a>
          
          <a href="https://kingdix10.gitee.io/en/" class="nav_child nav_item">English</a>
          
        </div>
      </div>
<div class='follow'>
  <a href="https://gitee.com/kingdix10">
    <svg class="icon">
  <title>gitee</title>
  <use xlink:href="#gitee"></use>
</svg>

  </a>
  <a href="https://github.com/kingdix10">
    <svg class="icon">
  <title>github</title>
  <use xlink:href="#github"></use>
</svg>

  </a>
    
  <a href="https://kingdix10.gitee.io/index.xml">
    <svg class="icon">
  <title>rss</title>
  <use xlink:href="#rss"></use>
</svg>

  </a>
<div class="color_mode">
  <input type="checkbox" class="color_choice" id="mode">
</div>

</div>

    </div>
  </nav>
</header>

    <main>
<div class="grid-inverse wrap content">
  <article class="post_content">
    <h1 class="post_title">嵌入式学习环境快速搭建（二）</h1>
  <div class="post_meta">
    <span><svg class="icon">
  <title>calendar</title>
  <use xlink:href="#calendar"></use>
</svg>
</span>
    <span class="post_date">
      2020/02/06</span>
    <span class="post_time"> | 5 分钟阅读</span><span>&nbsp;|<a href='https://kingdix10.gitee.io/tags/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/' title="环境搭建" class="post_tag button button_translucent">环境搭建
        </a>
    </span>
    <span class="page_only">&nbsp;|
  <div class="post_share">
    分享到:

    <a href="https://kingdix10.gitee.io/post/dev_env/eel_env/eel_readm/" title="Copy Link" class="link link_yank">
      <svg class="icon">
  <title>copy</title>
  <use xlink:href="#copy"></use>
</svg>

    </a>
  </div>
  
</span>
  </div>



      <div class="post_toc">
        <h2>文章目录</h2>
        <nav id="TableOfContents">
  <ul>
    <li><a href="#1-eel简介">1. eel简介</a>
      <ul>
        <li><a href="#11-gitee仓库">1.1. gitee仓库</a></li>
        <li><a href="#12-主目录结构">1.2. 主目录结构</a></li>
        <li><a href="#13-source目录">1.3. source目录</a></li>
        <li><a href="#14-changes目录">1.4. changes目录</a></li>
      </ul>
    </li>
    <li><a href="#2-快速上手">2. 快速上手</a>
      <ul>
        <li><a href="#21-准备工作">2.1. 准备工作</a></li>
        <li><a href="#22-下载源码">2.2. 下载源码</a></li>
        <li><a href="#23-获取帮助">2.3. 获取帮助</a></li>
        <li><a href="#24-变量配置">2.4. 变量配置</a></li>
        <li><a href="#25-运行测试">2.5. 运行测试</a></li>
      </ul>
    </li>
    <li><a href="#3-其他操作">3. 其他操作</a>
      <ul>
        <li><a href="#31-新建defconfig">3.1. 新建defconfig</a></li>
        <li><a href="#32-获取参与编译的文件列表">3.2. 获取参与编译的文件列表</a></li>
        <li><a href="#33-生成函数调用sourcetrail工程">3.3. 生成函数调用SourceTrail工程</a></li>
      </ul>
    </li>
    <li><a href="#4-常见配置项">4. 常见配置项</a>
      <ul>
        <li><a href="#41-qe_serial选项说明">4.1. QE_SERIAL选项说明</a></li>
      </ul>
    </li>
    <li><a href="#5-模块源码target说明">5. 模块源码target说明</a>
      <ul>
        <li><a href="#51-git仓库相关target">5.1. git仓库相关target</a></li>
        <li><a href="#52-源码相关target">5.2. 源码相关target</a></li>
      </ul>
    </li>
    <li><a href="#6-编译相关target说明">6. 编译相关target说明</a>
      <ul>
        <li><a href="#61-mod-说明">6.1. <code>$mod-%</code>说明</a></li>
        <li><a href="#62-allall-tee">6.2. all/all-tee</a></li>
        <li><a href="#63-qemu">6.3. qemu</a></li>
        <li><a href="#64-atf">6.4. atf</a></li>
        <li><a href="#65-optee">6.5. optee</a>
          <ul>
            <li><a href="#651-optee_os">6.5.1. optee_os</a></li>
            <li><a href="#652-optee_client">6.5.2. optee_client</a></li>
            <li><a href="#653-optee_examples">6.5.3. optee_examples</a></li>
          </ul>
        </li>
        <li><a href="#66-uboot">6.6. uboot</a></li>
        <li><a href="#67-kernel">6.7. kernel</a></li>
        <li><a href="#68-kmodules">6.8. kmodules</a></li>
        <li><a href="#69-rootfs">6.9. rootfs</a>
          <ul>
            <li><a href="#691-busybox">6.9.1. busybox</a></li>
            <li><a href="#692-rootfs_bb">6.9.2. rootfs_bb</a></li>
            <li><a href="#693-buildroot">6.9.3. buildroot</a></li>
            <li><a href="#694-rootfs_br">6.9.4. rootfs_br</a></li>
            <li><a href="#695-bootstrap">6.9.5. bootstrap</a></li>
            <li><a href="#696-rootfs_bs">6.9.6. rootfs_bs</a></li>
          </ul>
        </li>
        <li><a href="#610-gdb">6.10. gdb</a></li>
        <li><a href="#611-toolchain">6.11. toolchain</a></li>
      </ul>
    </li>
    <li><a href="#7-vs-code--gdb调试">7. VS Code + GDB调试</a></li>
  </ul>
</nav>
      </div>
    
    <div class="post_body"><h1 id="1-eel简介">1. eel简介</h1>
<p>目标：</p>
<ul>
<li>支持多种自定义配置</li>
<li>支持arm/arm64/riscv32/riscv64</li>
<li>一键实现atf、optee、u-boot、kernel、rootfs的编译</li>
<li>一键模拟运行</li>
<li>支持多个源码版本</li>
<li>尽量遵循官方说明的编译方法，编译过程和命令对用户可见</li>
<li>支持VS Code + qemu + gdb调试</li>
</ul>
<p>特性：</p>
<ul>
<li>自动下载依赖包</li>
<li>自动处理依赖，完成编译</li>
<li>自动处理依赖，实现qemu运行</li>
</ul>
<p>测试环境：</p>
<ol>
<li>VMWare虚拟机安装Debian 11</li>
<li>VMWare虚拟机内Debian 11，Debian 11 Docker</li>
<li>PVE内LXC安装Debian 11</li>
<li>PVE内LXC安装Debian 11，Debian 11 Docker</li>
</ol>
<p>测试版本：</p>
<table>
<thead>
<tr>
<th style="text-align:left">source</th>
<th style="text-align:left">version</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">ARM trusted firmware</td>
<td style="text-align:left">2.7.0/2.8.0</td>
</tr>
<tr>
<td style="text-align:left">optee</td>
<td style="text-align:left">3.18.0</td>
</tr>
<tr>
<td style="text-align:left">u-boot</td>
<td style="text-align:left">2020.04/2022.10</td>
</tr>
<tr>
<td style="text-align:left">linux</td>
<td style="text-align:left">5.10/5.15/6.0/6.1</td>
</tr>
<tr>
<td style="text-align:left">busybox</td>
<td style="text-align:left">1.35.0</td>
</tr>
<tr>
<td style="text-align:left">buildroot</td>
<td style="text-align:left">2022.11</td>
</tr>
</tbody>
</table>
<p>其他说明：</p>
<ol>
<li>optee-3.19.0增加了libacl，需要-lbuuid选项，未编译成功。</li>
<li>linux-4.x版本编译时依赖compile-gcc$version.h，$version为gcc版本，源码中默认没有高版本的头文件，可以复制其他文件作为compile-gcc$version.h</li>
</ol>
<h2 id="11-gitee仓库">1.1. gitee仓库</h2>
<p>eel仓库下的几个仓库本身属于eel的子模块，但是 <code>git submodule</code>命令相对小众，使用起来也没有明显的优势，这几个仓库还是作为独立的仓库处理。</p>
<ul>
<li>环境搭建脚本仓库：<a href="https://gitee.com/kingdix10/envsetup">https://gitee.com/kingdix10/envsetup</a></li>
<li>eel主仓库：<a href="https://gitee.com/kingdix10/eel">https://gitee.com/kingdix10/eel</a></li>
<li>eel改动仓库：<a href="https://gitee.com/kingdix10/eel-changes">https://gitee.com/kingdix10/eel-changes</a></li>
<li>驱动示例仓库：<a href="https://gitee.com/kingdix10/eel-kmodules">https://gitee.com/kingdix10/eel-kmodules</a></li>
<li>辅助工具仓库：<a href="https://gitee.com/kingdix10/eel-ctools">https://gitee.com/kingdix10/eel-ctools</a></li>
</ul>
<p>源码下载可以参考《快速上手》部分。</p>
<h2 id="12-主目录结构">1.2. 主目录结构</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">$(</span>EELDIR<span class="k">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">├── Makefile                        <span class="c1"># 主Makefile</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">├── Makefile.arm                    <span class="c1"># ARM和ARM64相关target</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">├── Makefile.riscv                  <span class="c1"># riscv32和riscv64相关target</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">├── config.mk                       <span class="c1"># 通用配置文件</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">├── config.arm.mk                   <span class="c1"># ARM配置文件</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">├── config.arm64.mk                 <span class="c1"># ARM64配置文件</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">├── config.riscv23.mk               <span class="c1"># riscv32配置文件</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">├── config.riscv64.mk               <span class="c1"># riscv64配置文件</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">├── .tmp.config.mk                  <span class="c1"># select指定的文件</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">├── suburl.mk                       <span class="c1"># eel-changes和eel-kmodules的仓库地址</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">├── toolchain.mk                    <span class="c1"># 交叉编译工具链地址</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">├── ctools/                         <span class="c1"># 辅助工具及脚本目录</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">├── docs/                           <span class="c1"># 文档目录</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">|</span>   └── README.md                   <span class="c1"># 说明文档</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">├── download/                       <span class="c1"># 下载目录</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">|</span>   └── buildroot-dl/               <span class="c1"># buildroot下载目录</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">├── dumpdt/                         <span class="c1"># dump qemu用到的dtb</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">├── changes/                        <span class="c1"># 与源码目录对应的修改，来自eel-changes仓库</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">├── mks/                            <span class="c1"># 自定义配置文件目录</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">├── output/                         <span class="c1"># 编译生成物</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">├── share/                          <span class="c1"># QEMU虚拟机共享目录</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">├── source/                         <span class="c1"># 源码目录</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">├── toolchain/                      <span class="c1"># 交叉编译工具</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">└── .vscode
</span></span><span class="line"><span class="ln">26</span><span class="cl">    └── launch.json                 <span class="c1"># 用于VSCode GDB调试vmlinux</span>
</span></span></code></pre></div><p>根文件系统中，会自动挂载主机与虚拟机共享目录到 <code>/mnt/</code>和 <code>/mnt/arch/</code>，分别是公共共享目录和体系结构相关目录，对应主机目录分别为 <code>$(EELDIR)/share/</code>和 <code>$(OUTDIR)/$(ARCH)/rootfs/share/</code>。</p>
<h2 id="13-source目录">1.3. source目录</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">$(</span>EELDIR<span class="k">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">└── <span class="nb">source</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    ├── kernel
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    │   ├── linux-6.1               <span class="c1"># linux-6.1源码解压，使用git管理，方便代码阅读</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    │   └── linux-repo              <span class="c1"># 官方git仓库</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    ├── kmodules                    <span class="c1"># 内核模块例程，按内核般般划分</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    │   └── linux-6.1               <span class="c1"># linux-6.1内核模块例程</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    ├── optee
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    │   ├── optee_client-repo
</span></span><span class="line"><span class="ln">10</span><span class="cl">    │   ├── optee_examples-repo
</span></span><span class="line"><span class="ln">11</span><span class="cl">    │   └── optee_os-repo
</span></span><span class="line"><span class="ln">12</span><span class="cl">    ├── rootfs
</span></span><span class="line"><span class="ln">13</span><span class="cl">    │   ├── buildroot-repo
</span></span><span class="line"><span class="ln">14</span><span class="cl">    │   └── busybox-repo
</span></span><span class="line"><span class="ln">15</span><span class="cl">    ├── trusted-firmware
</span></span><span class="line"><span class="ln">16</span><span class="cl">    │   └── trusted-firmware-a-repo
</span></span><span class="line"><span class="ln">17</span><span class="cl">    └── u-boot
</span></span><span class="line"><span class="ln">18</span><span class="cl">        ├── u-boot-2022.10          <span class="c1"># u-boot-2022.10源码解压，使用git管理，方便代码阅读</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        └── u-boot-repo             <span class="c1"># 官方git仓库</span>
</span></span></code></pre></div><h2 id="14-changes目录">1.4. changes目录</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">$(</span>EELDIR<span class="k">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">└── changes
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    ├── kernel
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    │   ├── linux-5.10
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    │   ├── linux-5.15
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    │   └── linux-6.1               <span class="c1"># 针对linux-6.1的修改，包含deconfig等</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    ├── rootfs
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    │   ├── bb-etc                  <span class="c1"># busybox根文件系统/etc目录示例</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    │   ├── bootstrap               <span class="c1"># bootstrap脚本</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    │   ├── br-rfs-overlay          <span class="c1"># 用于新增/覆盖buildroot根文件系统部分文件</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    │   ├── buildroot-2022.11       <span class="c1"># 针对buildroot-2022.11的修改，包含deconfig等</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    │   └── busybox-1.35.0          <span class="c1"># 针对busybox-1.35.0的修改，包含deconfig等</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    └── u-boot
</span></span><span class="line"><span class="ln">14</span><span class="cl">        └── u-boot-2022.10
</span></span></code></pre></div><h1 id="2-快速上手">2. 快速上手</h1>
<h2 id="21-准备工作">2.1. 准备工作</h2>
<p>做完开发环境搭建或安装 <code>git</code>、<code>make</code>等工具后，可以使用如下命令下载。
eel下的几个子仓库地址在 <code>suburl.mk</code>中定义，默认使用的是https协议，如果已经把ssh公钥添加到gitee，可以改成ssh协议。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">git clone https://gitee.com/kingdix10/eel.git
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># git clone git@gitee.com:kingdix10/eel.git</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nb">cd</span> eel
</span></span><span class="line"><span class="ln">4</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 clone-chg clone-km clone-ctl
</span></span></code></pre></div><h2 id="22-下载源码">2.2. 下载源码</h2>
<p>如果要分析、修改特定版本的代码，建议下载源码的压缩包，并创建本地git仓库</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 下载+解压</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 dec-kl <span class="nv">KL_VERSION</span><span class="o">=</span>6.1
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"># 下载+解压+创建本地git仓库</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 git-ub <span class="nv">UB_VERSION</span><span class="o">=</span>2022.10
</span></span></code></pre></div><p>也可以clone代码的官方仓库，里边会包含各个版本的tag。但是需要注意，重新编译时，在仓库里的修改会被覆盖掉。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 clone-kl
</span></span></code></pre></div><h2 id="23-获取帮助">2.3. 获取帮助</h2>
<p>如下以 <code>arm64</code>为例。</p>
<p>方式一：select选定配置</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">./select arm64.config.mk
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nb">help</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">make help-kernel
</span></span></code></pre></div><p>方式二：命令行指定变量值</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 <span class="nb">help</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 help-kernel
</span></span></code></pre></div><p>方式三：export环境变量</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">export</span> <span class="nv">ARCH</span><span class="o">=</span>arm64
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nb">help</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">make help-kernel
</span></span></code></pre></div><h2 id="24-变量配置">2.4. 变量配置</h2>
<p><code>config.mk</code>和 <code>config.$(ARCH).mk</code>中指定了默认的一些配置，mks目录下是一些自定义的配置，可以使用select来进行选择：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">$ ./select
</span></span><span class="line"><span class="ln">2</span><span class="cl">  File: /data/eel/.tmp.config.mk -&gt; /data/eel/mks/arm.config.mk
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">select</span> from:
</span></span><span class="line"><span class="ln">4</span><span class="cl">1. arm.config.mk
</span></span><span class="line"><span class="ln">5</span><span class="cl">2. arm64.config.mk
</span></span><span class="line"><span class="ln">6</span><span class="cl">3. riscv32.config.mk
</span></span><span class="line"><span class="ln">7</span><span class="cl">4. riscv64.config.mk
</span></span><span class="line"><span class="ln">8</span><span class="cl">input index: <span class="m">2</span>
</span></span></code></pre></div><p>也可以采用select + 文件名的方式：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">./select arm64.config.mk
</span></span><span class="line"><span class="ln">2</span><span class="cl">./select mks/arm64.config.mk
</span></span></code></pre></div><p>select之后，可以执行make相关命令，如<code>make qemu-kl</code>。命令含义参考《模块源码target说明》和《编译相关target说明》。</p>
<p><strong>注意</strong>：</p>
<ol>
<li><code>ARCH</code>变量必须被指定。</li>
<li>变量优先级：<code>命令行参数 &gt; export环境变量 &gt; .tmp.config.mk &gt; .config.$(ARCH).mk &gt; .config.mk</code></li>
<li>部分命令需要 <code>root</code>权限，需要提前修改 <code>SUDO</code>配置项，防止在执行过程中频繁提示输入密码，如 <code>SUDO = echo xxxx | sudo</code>，也可以 <code>echo &quot;$username ALL=NOPASSWD: ALL&quot; &gt; /etc/sudoers.d/$user</code>重新登录来关掉密码。</li>
</ol>
<h2 id="25-运行测试">2.5. 运行测试</h2>
<p>如下命令会自动完成代码下载、编译，并使用QEMU模拟启动，命令含义可以参考后边的target说明。</p>
<ul>
<li><code>make ARCH=arm64 qemu-uboot</code></li>
<li><code>make ARCH=arm64 qemu-kernel</code></li>
<li><code>make ARCH=arm64 qemu-tee</code></li>
</ul>
<h1 id="3-其他操作">3. 其他操作</h1>
<h2 id="31-新建defconfig">3.1. 新建defconfig</h2>
<p>以U-Boot为例</p>
<p>方式一：</p>
<ol>
<li>基于现有的 <code>xxx_defconfig</code>进行 <code>make uboot-defconfig</code>，如 <code>make ARCH=arm64 uboot-defconfig UB_CONFIG=mine_arm64_defconfig</code>。</li>
<li>执行 <code>make ARCH=arm64 ub-menuconfig</code>，并根据需要进行修改并保存。</li>
<li>执行 <code>make ARCH=arm64 uboot-savedefconfig UB_SAVECONF=mine_arm64_defconfig</code>。</li>
</ol>
<p>方式二：</p>
<ol>
<li>基于现有的 <code>xxx_defconfig</code>复制生成新的config，如 <code>cp u-boot/configs/qemu_arm64_defconfig u-boot/configs/mine_arm64_defconfig</code>。</li>
<li>执行 <code>make ARCH=arm64 ub-menuconfig</code>，并根据需要进行修改并保存。</li>
<li>执行 <code>make ARCH=arm64 uboot-savedefconfig</code>，这一步会生成 <code>defcong</code>并，将 <code>defconfig</code>保存到 <code>u-boot/configs/mine_arm64_defconfig</code></li>
</ol>
<p>之后就可以通过修改 <code>config.mk</code>或使用 <code>make ARCH=arm64 uboot UB_CONFIG=mine_arm64_defconfig</code>进行编译。</p>
<h2 id="32-获取参与编译的文件列表">3.2. 获取参与编译的文件列表</h2>
<p><code>keepdep_patch.sh</code>可以修改编译脚本，保留编译过程中生成的 <code>.xxx.o.d</code>文件，方便使用 <code>depfilelist.sh</code>获取参与编译的文件列表，排除不必要的文件。</p>
<p>可以将 <code>keepdep_patch.sh</code>修改后的编译脚本放到changes目录，或在编译前使用 <code>keepdep_patch.sh</code>修改编译脚本（需要保证不会被changes目录下没有对应文件）。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">./ctools/keepdep_patch.sh source/kernel/linux-6.1/scripts/
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># 执行编译</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">./ctools/depfilelist.sh -d output/arm64/kernel/linux-6.1/mine_defconfig/ -o filelist.txt
</span></span></code></pre></div><p>filelist.txt稍加修改后，可以在vim或SourceInsight等工具中使用。</p>
<p><strong>注意</strong>：仅在U-Boot和Kernel测试过。</p>
<h2 id="33-生成函数调用sourcetrail工程">3.3. 生成函数调用SourceTrail工程</h2>
<p>SourceTrail是一款开源免费跨平台的跨平台源码阅读和可视化工具，依赖clang解析源码。但是用它来解析u-boot或kernel代码会非常慢，而且会因为无法找到一些编译器的头文件，导致解析不成功。</p>
<p><code>GCC 10.0</code>及之后版本支持 <code>-fcallgraph-info</code>编译选项，主Makefile添加此选项后，编译过程中会生成 <code>.ci</code>文件，<code>ctools/cgraph/traildb.py</code>工具利用 <code>.ci</code>来生成SourceTrail工程，方便查看函数关系。</p>
<p><code>ctools/cgraph/traildb.py</code>需要用到SourceTrailDB的python接口，<code>ctools/cgraph/</code>下提供了基于 <code>Debian 11</code>编译的 <code>sourcetraildb.py</code>和 <code>_sourcetraildb.so</code>，如果不能使用，需要参考<a href="ctools/README.md">ctools/README</a>下载SourceTrailDB编译替换。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># step 1</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">find output/arm64/kernel/linux-6.1/mine_defconfig/ -name <span class="s1">&#39;*.ci&#39;</span> &gt; cilist.txt
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># step 2</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">./ctools/cgraph/provider.py -I cilist -O db -o linux6.1.db -p /data/eel/source/kernel/linux-6.1/ -t linux_6_0 cilist.txt
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># step 3</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">./ctools/cgraph/traildb.py -I db -s /data/eel/source/kernel/linux-6.1/  -o linux6.1 linux6.1.db
</span></span></code></pre></div><p>step 1：生成 <code>.ci</code>文件列表。</p>
<p>step 2：解析 <code>.ci</code>文件，生成sqlite3数据库。
-p，<code>.ci</code>文件中，文件路径的前缀，取kernel源码的路径，如果输出目录和源码目录一致，可以不用设置
-t，数据库中的table名，不能包含 '-' 或 '.'</p>
<p>step 3：生成SourceTrail工程，包含 <code>.srctrlprj</code>和 <code>.srctrldb</code>文件，使用SourceTrail打开 <code>.srctrlprj</code>即可使用。
-s，内核源码目录，指定后可以使 <code>.srctrldb</code>包含源码</p>
<p><strong>注意</strong>：</p>
<ul>
<li>仅在U-Boot和Kernel测试过。</li>
<li>编译会导致部分函数被优化掉，无法在SourceTrail中显示</li>
</ul>
<h1 id="4-常见配置项">4. 常见配置项</h1>
<table>
<thead>
<tr>
<th style="text-align:left">配置项</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">USE_TEE</td>
<td style="text-align:left">是否使用optee</td>
</tr>
<tr>
<td style="text-align:left">QE_SERIAL</td>
<td style="text-align:left">QEMU串口设备，默认为none</td>
</tr>
<tr>
<td style="text-align:left">KL_ARGS</td>
<td style="text-align:left">内核bootargs</td>
</tr>
</tbody>
</table>
<h2 id="41-qe_serial选项说明">4.1. QE_SERIAL选项说明</h2>
<table>
<thead>
<tr>
<th style="text-align:left">QE_SERIAL</th>
<th style="text-align:left">command</th>
<th style="text-align:left">优势</th>
<th>缺点</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">none</td>
<td style="text-align:left">无</td>
<td style="text-align:left">可直接操作</td>
<td>只支持一个串口</td>
</tr>
<tr>
<td style="text-align:left">file</td>
<td style="text-align:left">无</td>
<td style="text-align:left">可保存完整启动日志</td>
<td>不可交互</td>
</tr>
<tr>
<td style="text-align:left">udp</td>
<td style="text-align:left">nc -u -l -p $port</td>
<td style="text-align:left">可查看启动日志，可交互</td>
<td>交互时使用Ctrl + C会使nc退出，重启QEMU需重新连接</td>
</tr>
<tr>
<td style="text-align:left">tcp</td>
<td style="text-align:left">nc -l -p $port</td>
<td style="text-align:left">可查看启动日志，可交互</td>
<td>需先启动nc监听tcp所有端口再启动QEMU，交互时使用Ctrl + C会使nc退出，重启QEMU需重新连接</td>
</tr>
<tr>
<td style="text-align:left">pty</td>
<td style="text-align:left">minicom -D /dev/pty/$NUM</td>
<td style="text-align:left">可交互、可自动重连</td>
<td>丢失部分启动日志，NUM需在QEMU启动后查看日志确定</td>
</tr>
</tbody>
</table>
<p>QE_SERIAL主要用在 <code>make qemu-tee</code>或 <code>make qemu-ub-tee</code>时，file/pty/udp/tcp都设置了两个串口，分别用于REE和TEE。</p>
<ul>
<li>file：日志分别记录到serial0.log和serial1.log</li>
<li>udp：port值为55550和55551</li>
<li>tcp：port值为55500和55501</li>
<li>pty：可查看QEMU启动最后的日志来得到NUM的值</li>
</ul>
<h1 id="5-模块源码target说明">5. 模块源码target说明</h1>
<p>相关target都是以 <code>xxx-$mod</code>命名，xxx为动作，方便与后边提到的 <code>$mod-%</code>区分。</p>
<h2 id="51-git仓库相关target">5.1. git仓库相关target</h2>
<p>由 <code>def_git_targets</code>批量生成，</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">clone-$mod</td>
<td style="text-align:left">git clone</td>
</tr>
<tr>
<td style="text-align:left">pull-$mod</td>
<td style="text-align:left">git pull，会拉取tag</td>
</tr>
</tbody>
</table>
<p>举例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 clone-changes
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 clone-kmodules
</span></span><span class="line"><span class="ln">3</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 pull-kmodules
</span></span></code></pre></div><h2 id="52-源码相关target">5.2. 源码相关target</h2>
<p>由 <code>def_dl_targets</code>批量生成</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">download-$mod</td>
<td style="text-align:left">下载源码压缩包</td>
</tr>
<tr>
<td style="text-align:left">dec-$mod</td>
<td style="text-align:left">解压源码</td>
</tr>
<tr>
<td style="text-align:left">git-$mod</td>
<td style="text-align:left">在源码路径创建本地git仓库</td>
</tr>
<tr>
<td style="text-align:left">prepare-$mod</td>
<td style="text-align:left">使用rsync同步changes的修改到源码路径，编译前会自动执行，通常不需要手动执行</td>
</tr>
</tbody>
</table>
<p>prepare-$mod的工作方式：如果没有指定版本的源码路径，如 <code>source/kernel/linux-6.1</code>，则选取 <code>linurx-repo</code>作为源码路径，并使用 <code>git checkout &lt;tag&gt;</code>切换到指定版本。</p>
<p>举例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 dec-kl          <span class="c1"># 解压源码，如果没有下载，会自动下载</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">make <span class="nv">ARCH</span><span class="o">=</span>arm64 git-kl          <span class="c1"># 创建本地仓库，如果没有下载解压，会自动下载、解压</span>
</span></span></code></pre></div><h1 id="6-编译相关target说明">6. 编译相关target说明</h1>
<h2 id="61-mod-说明">6.1. <code>$mod-%</code>说明</h2>
<p><code>$mod-%</code>表示切换到对应源码路径下，执行相应的操作，如 <code>make ARCH=arm64 ub-help</code>实际执行效果如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">make -j2 <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>	-C /data/eel/source/u-boot/u-boot-2022.10 <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>	<span class="nv">ARCH</span><span class="o">=</span>arm <span class="se">\
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="se"></span>	<span class="nv">CROSS_COMPILE</span><span class="o">=</span>/data/eel/toolchain/gcc-linaro-11.3.1-2022.06-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- <span class="se">\
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="se"></span>	<span class="nv">O</span><span class="o">=</span>/data/eel/output/arm64/u-boot/u-boot-2022.10/qemu_arm64_defconfig <span class="se">\
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="se"></span>	<span class="nb">help</span>
</span></span></code></pre></div><h2 id="62-allall-tee">6.2. all/all-tee</h2>
<p>编译镜像文件。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">all</td>
<td style="text-align:left">编译uboot、kernel、kl-modules、rootfs</td>
</tr>
<tr>
<td style="text-align:left">all-tee</td>
<td style="text-align:left">在all的基础上，增加atf、optee_os、optee_client、optee_examples</td>
</tr>
</tbody>
</table>
<h2 id="63-qemu">6.3. qemu</h2>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">qemu-uboot/qemu-ub</td>
<td style="text-align:left">使用QEMU模拟启动U-Boot</td>
</tr>
<tr>
<td style="text-align:left">qemu-kernel/qemu-kl</td>
<td style="text-align:left">使用QEMU模拟启动内核</td>
</tr>
<tr>
<td style="text-align:left">qemu</td>
<td style="text-align:left">使用QEMU模拟启动U-Boot，并自动启动内核</td>
</tr>
<tr>
<td style="text-align:left">qemu-tee</td>
<td style="text-align:left">使用QEMU模拟启动ARM trusted firmware，并加载optee_os和U-Boot，最终启动内核</td>
</tr>
<tr>
<td style="text-align:left">qemu-xxx-gdb</td>
<td style="text-align:left">添加&quot;-S -s&quot;参数，QEMU模拟启动后等待gdb连接</td>
</tr>
<tr>
<td style="text-align:left">qemu-dumpdt</td>
<td style="text-align:left">dump QEMU使用的dtb文件并反汇编，文件名前缀由DUMP_DT指定</td>
</tr>
</tbody>
</table>
<h2 id="64-atf">6.4. atf</h2>
<p>仅ARM和ARM64。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">atf</td>
<td style="text-align:left">编译ARM trusted firmware，依赖uboot或optee_os生成物</td>
</tr>
<tr>
<td style="text-align:left">atf-clean</td>
<td style="text-align:left">clean</td>
</tr>
</tbody>
</table>
<h2 id="65-optee">6.5. optee</h2>
<p>仅ARM和ARM64。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">optee</td>
<td style="text-align:left">optee_os、optee_client、optee_examples</td>
</tr>
<tr>
<td style="text-align:left">clone-optee</td>
<td style="text-align:left">clone optee_os、optee_client、optee_examples</td>
</tr>
</tbody>
</table>
<h3 id="651-optee_os">6.5.1. optee_os</h3>
<p>仅ARM和ARM64。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">optee_os</td>
<td style="text-align:left">编译optee_os</td>
</tr>
<tr>
<td style="text-align:left">optee_os-clean</td>
<td style="text-align:left">clean</td>
</tr>
</tbody>
</table>
<h3 id="652-optee_client">6.5.2. optee_client</h3>
<p>仅ARM和ARM64。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">optee_client</td>
<td style="text-align:left">编译optee_client，并生成库和头文件</td>
</tr>
<tr>
<td style="text-align:left">optee_client-install</td>
<td style="text-align:left">同optee_client</td>
</tr>
<tr>
<td style="text-align:left">optee_client-clean</td>
<td style="text-align:left">clean</td>
</tr>
</tbody>
</table>
<h3 id="653-optee_examples">6.5.3. optee_examples</h3>
<p>仅ARM和ARM64。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">otex-%</td>
<td style="text-align:left">编译ta、ca和plugin</td>
</tr>
<tr>
<td style="text-align:left">otex-%-host</td>
<td style="text-align:left">编译ca</td>
</tr>
<tr>
<td style="text-align:left">otex-%-ta</td>
<td style="text-align:left">编译ta</td>
</tr>
<tr>
<td style="text-align:left">optee_examples</td>
<td style="text-align:left">依赖optee_os和optee_client</td>
</tr>
<tr>
<td style="text-align:left">optee_examples-install</td>
<td style="text-align:left">将ta、ca和plugin放到对应目录</td>
</tr>
<tr>
<td style="text-align:left">optee_examples-clean</td>
<td style="text-align:left">clean</td>
</tr>
</tbody>
</table>
<h2 id="66-uboot">6.6. uboot</h2>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">uboot</td>
<td style="text-align:left">生成uboot镜像</td>
</tr>
<tr>
<td style="text-align:left">uboot-defconfig</td>
<td style="text-align:left">make $(UB_CONFIG)</td>
</tr>
<tr>
<td style="text-align:left">uboot-menuconfig</td>
<td style="text-align:left">menuconfig</td>
</tr>
<tr>
<td style="text-align:left">uboot-savedefconfig</td>
<td style="text-align:left">保存defconfig为UB_SAVECONF，UB_SAVECONF默认同UB_CONFIG</td>
</tr>
<tr>
<td style="text-align:left">uboot-dis</td>
<td style="text-align:left">反汇编u-boot ELF文件</td>
</tr>
</tbody>
</table>
<h2 id="67-kernel">6.7. kernel</h2>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">kernel</td>
<td style="text-align:left">生成kernel镜像</td>
</tr>
<tr>
<td style="text-align:left">kernel-defconfig</td>
<td style="text-align:left">make $(KL_CONFIG)</td>
</tr>
<tr>
<td style="text-align:left">kernel-menuconfig</td>
<td style="text-align:left">menuconfig</td>
</tr>
<tr>
<td style="text-align:left">kernel-savedefconfig</td>
<td style="text-align:left">保存defconfig为KL_SAVECONF，KL_SAVECONF默认同KL_CONFIG</td>
</tr>
<tr>
<td style="text-align:left">kernel-dis</td>
<td style="text-align:left">反汇编vmlinux ELF文件</td>
</tr>
<tr>
<td style="text-align:left">kernel-modules</td>
<td style="text-align:left">make modules</td>
</tr>
<tr>
<td style="text-align:left">kernel-modules_install</td>
<td style="text-align:left">make modules_install</td>
</tr>
</tbody>
</table>
<h2 id="68-kmodules">6.8. kmodules</h2>
<p>详细内容参考 <code>eel-kmoduels</code>的<a href="source/kernel/kmodules/README.md">README</a>。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">km-%</td>
<td style="text-align:left">执行kmodules下对应的target</td>
</tr>
<tr>
<td style="text-align:left">kmodules</td>
<td style="text-align:left">同km-all，编译kmodules所有文件</td>
</tr>
</tbody>
</table>
<h2 id="69-rootfs">6.9. rootfs</h2>
<p>构建根文件系统，默认使用 <code>ext4</code>格式，可以指定 <code>RFS_TYPE</code>使用其他文件系统。</p>
<p>默认使用buildroot方式构建根文件系统，busybox方式只是为了演示建立根文件系统的基本步骤。
bootstrap方式在Debian 11上验证过，目前测试只有ARM64 + Debian 10(Buster)可以启动。root密码由 <code>changes/rootfs/bootstrap/bs-post1-passwd.sh</code>设置，默认密码为123。</p>
<p><code>RFS_TYPE</code>支持的文件系统格式与 <code>rootfs_$(RFS_MODE)</code>相关，具体参考 <code>rootfs_$(RFS_MODE)</code>内容。</p>
<ul>
<li>bb: busybox</li>
<li>br: buildroot</li>
<li>bs: bootstrap，debootstrap</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">rootfs</td>
<td style="text-align:left">rootfs_$(RFS_MODE)</td>
</tr>
<tr>
<td style="text-align:left">rootfs_info</td>
<td style="text-align:left">输出当前使用的根文件系统信息</td>
</tr>
</tbody>
</table>
<h3 id="691-busybox">6.9.1. busybox</h3>
<p>主要包含 <code>busybox</code>官方源码和 <code>etc</code>目录示例，是构建根文件系统的基本组成元素。为了方便测试交叉编译的程序，busybox使用动态链接，所以需要在制作 <code>rootfs</code>时指定交叉编译工具链的共享库路径。共享库路径由 <code>config.mk</code>的 <code>COMPILE_LIB_PATH</code>指定。</p>
<p>busybox只支持 <code>ext4</code>和 <code>erofs</code>格式的根文件系统，根文件系统镜像位于 <code>$(O_RFS_DIR)/rootfs_$(ARCH).$(RFS_TYPE)</code>。</p>
<ul>
<li><code>make ARCH=arm64 rootfs_ext4</code></li>
<li><code>make ARCH=arm64 rootfs_erofs</code></li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">busybox</td>
<td style="text-align:left">编译busybox</td>
</tr>
<tr>
<td style="text-align:left">busybox-defconfig</td>
<td style="text-align:left">make $(BB_CONFIG)</td>
</tr>
<tr>
<td style="text-align:left">busybox-menuconfig</td>
<td style="text-align:left">menuconfig</td>
</tr>
<tr>
<td style="text-align:left">busybox-savedefconfig</td>
<td style="text-align:left">保存.config为BB_SAVECONF，BB_SAVECONF默认同BB_CONFIG</td>
</tr>
<tr>
<td style="text-align:left">busybox-install</td>
<td style="text-align:left">将文件install到busybox输出目录的_install目录</td>
</tr>
</tbody>
</table>
<h3 id="692-rootfs_bb">6.9.2. rootfs_bb</h3>
<p>busybox只支持 <code>ext4</code>和 <code>erofs</code>格式的根文件系统，根文件系统镜像位于 <code>$(O_RFS_DIR)/rootfs_$(ARCH).$(RFS_TYPE)</code>。
如果需要支持其他格式，可以参考 <code>rootfs_bb_ext4</code>和 <code>rootfs_bb_erofs</code>修改Makefile。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">rootfs_bb</td>
<td style="text-align:left">依赖busybox，实际执行rootfs_bb_$(RFS_TYPE)</td>
</tr>
<tr>
<td style="text-align:left">rootfs_bb_ext4</td>
<td style="text-align:left">生成ext4格式的根文件系统镜像</td>
</tr>
<tr>
<td style="text-align:left">rootfs_bb_erofs</td>
<td style="text-align:left">生成erofs格式的根文件系统镜像</td>
</tr>
<tr>
<td style="text-align:left">rootfs_bb_dir</td>
<td style="text-align:left">存放根文件系统的临时目录</td>
</tr>
</tbody>
</table>
<h3 id="693-buildroot">6.9.3. buildroot</h3>
<p>buildroot支持的文件系统格式由 <code>xxx_defconfig</code>指定。
buildroot编译时，使用了 <code>BUSYBOX_OVERRIDE_SRCDIR</code>保持rootfs_br使用的busybox版本与rootfs_bb保持一致。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">buildroot</td>
<td style="text-align:left">编译buildroot</td>
</tr>
<tr>
<td style="text-align:left">buildroot-defconfig</td>
<td style="text-align:left">make $(BR_CONFIG)</td>
</tr>
<tr>
<td style="text-align:left">buildroot-menuconfig</td>
<td style="text-align:left">menuconfig</td>
</tr>
<tr>
<td style="text-align:left">buildroot-savedefconfig</td>
<td style="text-align:left">保存defconfig为BR_SAVECONF，BR_SAVECONF默认同BR_CONFIG</td>
</tr>
<tr>
<td style="text-align:left">buildroot-modifyconfig</td>
<td style="text-align:left">对prepare-br放到buildroot源码目录的$(BR_CONFIG)进行修改</td>
</tr>
</tbody>
</table>
<p>BR_CONFIG文件中指定了交叉编译工具链的路径和一些其他配置，可能与实际使用的不一致，使用buildroot-modifyconfig修改BR_CONFIG使配置与实际保持一致。BR_CONFIG文件内容也必须保证文件内有这些配置项。</p>
<h3 id="694-rootfs_br">6.9.4. rootfs_br</h3>
<p>rootfs_br_$(RFS_TYPE)最终都是执行了buildroot。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">rootfs_br</td>
<td style="text-align:left">rootfs_br_$(RFS_TYPE)</td>
</tr>
</tbody>
</table>
<h3 id="695-bootstrap">6.9.5. bootstrap</h3>
<p><strong>注意</strong>：未充分测试。</p>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">bootstrap-prepare</td>
<td style="text-align:left">执行update-binfmts --enable</td>
</tr>
<tr>
<td style="text-align:left">bootstrap1</td>
<td style="text-align:left">执行bootstrap的步骤1，主要是下载文件</td>
</tr>
<tr>
<td style="text-align:left">bootstrap2</td>
<td style="text-align:left">执行bootstrap的步骤2，主要是chroot进行配置</td>
</tr>
<tr>
<td style="text-align:left">bootstrap-post</td>
<td style="text-align:left">执行changes中bootstrap指定的自定义脚本</td>
</tr>
<tr>
<td style="text-align:left">bs-clean</td>
<td style="text-align:left">删除bootstrap的目录</td>
</tr>
</tbody>
</table>
<h3 id="696-rootfs_bs">6.9.6. rootfs_bs</h3>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">rootfs_br</td>
<td style="text-align:left">rootfs_br_$(RFS_TYPE)</td>
</tr>
<tr>
<td style="text-align:left">rootfs_bs_ext4</td>
<td style="text-align:left">将bootstrap目录制作成ext4文件系统镜像</td>
</tr>
</tbody>
</table>
<h2 id="610-gdb">6.10. gdb</h2>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">gdb-ub/gdb-uboot</td>
<td style="text-align:left">gdb调试u-boot ELF文件</td>
</tr>
<tr>
<td style="text-align:left">gdb-kl/gdb-kernel</td>
<td style="text-align:left">gdb调试vmlinux ELF文件</td>
</tr>
<tr>
<td style="text-align:left">gdb/gdb-tee</td>
<td style="text-align:left">启动gdb调试</td>
</tr>
</tbody>
</table>
<h2 id="611-toolchain">6.11. toolchain</h2>
<table>
<thead>
<tr>
<th style="text-align:left">target</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">toolchain</td>
<td style="text-align:left">解压toolchain并输出信息</td>
</tr>
<tr>
<td style="text-align:left">dec-toolchain</td>
<td style="text-align:left">解压toolchain</td>
</tr>
<tr>
<td style="text-align:left">toolchain_info</td>
<td style="text-align:left">输出toolchain信息</td>
</tr>
</tbody>
</table>
<h1 id="7-vs-code--gdb调试">7. VS Code + GDB调试</h1>
<p><code>.vscode/launch.json</code></p>
<p>TODO: VS Code + GDB</p>

    </div><div class="post_comments">
  
  
  
</div>



  </article>
<aside class="sidebar">
  <section class="sidebar_inner">
    <br>
    
  
  <div class="search">
    <input type="search" class="search_field form_field" placeholder='搜索内容...' id="find" autocomplete="off" data-scope='post'>
    <label for="find" class="search_label"><svg class="icon">
  <title>search</title>
  <use xlink:href="#search"></use>
</svg>

    </label>
    
    <div class="search_results results"></div>
  </div>

        <div class="author_header">
          <img src="https://kingdix10.gitee.io/logos/icon_yellow_transparent.png" alt="kingdix10 photo">
          <h2>kingdix10</h2>
        </div>
      <div class="author_bio">
        拾月国度
      </div>
      <a href='https://kingdix10.gitee.io/about/' class="button mt-1" role="button" title='阅读更多'>阅读更多</a>

    
      
    
    <h2 class="mt-4">最新文章</h2>
    <ul class="flex-column">
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.6/kdump_crash/arm64_setup/" class="nav-link" title="ARM64 Crash调试环境搭建">ARM64 Crash调试环境搭建</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.6/kdump_crash/help/" class="nav-link" title="Crash帮助信息">Crash帮助信息</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/thermal/thermal/" class="nav-link" title="linux thermal子系统简介">linux thermal子系统简介</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/time/clocksource_clockevent/" class="nav-link" title="linux内核时间子系统（三）">linux内核时间子系统（三）</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/time/timekeeping/" class="nav-link" title="linux内核时间子系统（二）">linux内核时间子系统（二）</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/time/tim/" class="nav-link" title="linux内核时间子系统（一）">linux内核时间子系统（一）</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/device_driver/device_model/" class="nav-link" title="Linux内核驱动模型（四）核心结构体">Linux内核驱动模型（四）核心结构体</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/device_driver/initcall/" class="nav-link" title="Linux内核驱动模型（三）驱动初始化">Linux内核驱动模型（三）驱动初始化</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/fdt/dt_to_dt/" class="nav-link" title="Linux内核驱动模型（二）设备树转换">Linux内核驱动模型（二）设备树转换</a>
      </li>
      <li>
        <a href="https://kingdix10.gitee.io/post/kernel/linux-6.1/fdt/fdt_dt/" class="nav-link" title="Linux内核驱动模型（一）设备树展开">Linux内核驱动模型（一）设备树展开</a>
      </li>
    </ul>
    <div>
      <h2 class="mt-4 taxonomy" id="categories-section">分类</h2>
      <nav class="tags_nav">
        <a href='https://kingdix10.gitee.io/categories/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/' class="post_tag button button_translucent" title="进程管理">
          进程管理
          <span class="button_tally">11</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E8%AE%BE%E5%A4%87%E6%A8%A1%E5%9E%8B/' class="post_tag button button_translucent" title="设备模型">
          设备模型
          <span class="button_tally">5</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/4412/' class="post_tag button button_translucent" title="4412">
          4412
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/c%E8%AF%AD%E8%A8%80/' class="post_tag button button_translucent" title="c语言">
          C语言
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/' class="post_tag button button_translucent" title="启动流程">
          启动流程
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E6%97%B6%E9%97%B4%E5%AD%90%E7%B3%BB%E7%BB%9F/' class="post_tag button button_translucent" title="时间子系统">
          时间子系统
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/kdump-crash/' class="post_tag button button_translucent" title="kdump-crash">
          KDUMP-CRASH
          <span class="button_tally">2</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/' class="post_tag button button_translucent" title="环境搭建">
          环境搭建
          <span class="button_tally">2</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/linux%E5%91%BD%E4%BB%A4/' class="post_tag button button_translucent" title="linux命令">
          LINUX命令
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/thermal%E5%AD%90%E7%B3%BB%E7%BB%9F/' class="post_tag button button_translucent" title="thermal子系统">
          THERMAL子系统
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/' class="post_tag button button_translucent" title="内存管理">
          内存管理
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E5%86%85%E6%A0%B8%E5%9F%BA%E7%A1%80/' class="post_tag button button_translucent" title="内核基础">
          内核基础
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/categories/%E5%86%85%E6%A0%B8%E8%B0%83%E8%AF%95/' class="post_tag button button_translucent" title="内核调试">
          内核调试
          <span class="button_tally">1</span>
        </a>
        
        
      </nav>
    </div>
    <div>
      <h2 class="mt-4 taxonomy" id="series-section">专栏</h2>
      <nav class="tags_nav">
        <a href='https://kingdix10.gitee.io/series/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/' class="post_tag button button_translucent" title="进程管理">
          进程管理
          <span class="button_tally">11</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/series/%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B/' class="post_tag button button_translucent" title="设备驱动模型">
          设备驱动模型
          <span class="button_tally">5</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/series/%E6%97%B6%E9%97%B4%E5%AD%90%E7%B3%BB%E7%BB%9F/' class="post_tag button button_translucent" title="时间子系统">
          时间子系统
          <span class="button_tally">3</span>
        </a>
        
        
      </nav>
    </div>
    <div>
      <h2 class="mt-4 taxonomy" id="tags-section">标签</h2>
      <nav class="tags_nav">
        <a href='https://kingdix10.gitee.io/tags/linux%E5%86%85%E6%A0%B8/' class="post_tag button button_translucent" title="linux内核">
          LINUX内核
          <span class="button_tally">19</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/linux-6.1/' class="post_tag button button_translucent" title="linux-6.1">
          LINUX-6.1
          <span class="button_tally">12</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/linux-6.6/' class="post_tag button button_translucent" title="linux-6.6">
          LINUX-6.6
          <span class="button_tally">9</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8/' class="post_tag button button_translucent" title="内核驱动">
          内核驱动
          <span class="button_tally">9</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/' class="post_tag button button_translucent" title="进程管理">
          进程管理
          <span class="button_tally">6</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/linux/' class="post_tag button button_translucent" title="linux">
          LINUX
          <span class="button_tally">5</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/4412/' class="post_tag button button_translucent" title="4412">
          4412
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/c%E8%AF%AD%E8%A8%80/' class="post_tag button button_translucent" title="c语言">
          C语言
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/' class="post_tag button button_translucent" title="启动流程">
          启动流程
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E5%B7%A5%E5%85%B7/' class="post_tag button button_translucent" title="工具">
          工具
          <span class="button_tally">3</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/kdump-crash/' class="post_tag button button_translucent" title="kdump-crash">
          KDUMP-CRASH
          <span class="button_tally">2</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/' class="post_tag button button_translucent" title="环境搭建">
          环境搭建
          <span class="button_tally">2</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/arm64/' class="post_tag button button_translucent" title="arm64">
          ARM64
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/u-boot/' class="post_tag button button_translucent" title="u-boot">
          U-BOOT
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/' class="post_tag button button_translucent" title="内存管理">
          内存管理
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E5%86%85%E6%A0%B8%E8%B0%83%E8%AF%95/' class="post_tag button button_translucent" title="内核调试">
          内核调试
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/' class="post_tag button button_translucent" title="数据结构">
          数据结构
          <span class="button_tally">1</span>
        </a>
        
        <a href='https://kingdix10.gitee.io/tags/%E8%B0%83%E8%AF%95/' class="post_tag button button_translucent" title="调试">
          调试
          <span class="button_tally">1</span>
        </a>
        
        
      </nav>
    </div>
  </section>
</aside>

  
</div>
    </main><svg width="0" height="0" class="hidden">
  <symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="facebook">
    <path d="M437 0H75C33.648 0 0 33.648 0 75v362c0 41.352 33.648 75 75 75h151V331h-60v-90h60v-61c0-49.629 40.371-90 90-90h91v90h-91v61h91l-15 90h-76v181h121c41.352 0 75-33.648 75-75V75c0-41.352-33.648-75-75-75zm0 0"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.001 18.001" id="twitter">
    <path d="M15.891 4.013c.808-.496 1.343-1.173 1.605-2.034a8.68 8.68 0 0 1-2.351.861c-.703-.756-1.593-1.14-2.66-1.14-1.043 0-1.924.366-2.643 1.078a3.56 3.56 0 0 0-1.076 2.605c0 .309.039.585.117.819-3.076-.105-5.622-1.381-7.628-3.837-.34.601-.51 1.213-.51 1.846 0 1.301.549 2.332 1.645 3.089-.625-.053-1.176-.211-1.645-.47 0 .929.273 1.705.82 2.388a3.623 3.623 0 0 0 2.115 1.291c-.312.08-.641.118-.979.118-.312 0-.533-.026-.664-.083.23.757.664 1.371 1.291 1.841a3.652 3.652 0 0 0 2.152.743C4.148 14.173 2.625 14.69.902 14.69c-.422 0-.721-.006-.902-.038 1.697 1.102 3.586 1.649 5.676 1.649 2.139 0 4.029-.542 5.674-1.626 1.645-1.078 2.859-2.408 3.639-3.974a10.77 10.77 0 0 0 1.172-4.892v-.468a7.788 7.788 0 0 0 1.84-1.921 8.142 8.142 0 0 1-2.11.593z"
      ></path>
  </symbol>
  <symbol aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="mail">
    <path  d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="calendar">
    <path d="M452 40h-24V0h-40v40H124V0H84v40H60C26.916 40 0 66.916 0 100v352c0 33.084 26.916 60 60 60h392c33.084 0 60-26.916 60-60V100c0-33.084-26.916-60-60-60zm20 412c0 11.028-8.972 20-20 20H60c-11.028 0-20-8.972-20-20V188h432v264zm0-304H40v-48c0-11.028 8.972-20 20-20h24v40h40V80h264v40h40V80h24c11.028 0 20 8.972 20 20v48z"></path>
    <path d="M76 230h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zM76 310h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zM76 390h40v40H76zm80 0h40v40h-40zm80 0h40v40h-40zm80 0h40v40h-40zm80-80h40v40h-40z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="github">
    <path d="M255.968 5.329C114.624 5.329 0 120.401 0 262.353c0 113.536 73.344 209.856 175.104 243.872 12.8 2.368 17.472-5.568 17.472-12.384 0-6.112-.224-22.272-.352-43.712-71.2 15.52-86.24-34.464-86.24-34.464-11.616-29.696-28.416-37.6-28.416-37.6-23.264-15.936 1.728-15.616 1.728-15.616 25.696 1.824 39.2 26.496 39.2 26.496 22.848 39.264 59.936 27.936 74.528 21.344 2.304-16.608 8.928-27.936 16.256-34.368-56.832-6.496-116.608-28.544-116.608-127.008 0-28.064 9.984-51.008 26.368-68.992-2.656-6.496-11.424-32.64 2.496-68 0 0 21.504-6.912 70.4 26.336 20.416-5.696 42.304-8.544 64.096-8.64 21.728.128 43.648 2.944 64.096 8.672 48.864-33.248 70.336-26.336 70.336-26.336 13.952 35.392 5.184 61.504 2.56 68 16.416 17.984 26.304 40.928 26.304 68.992 0 98.72-59.84 120.448-116.864 126.816 9.184 7.936 17.376 23.616 17.376 47.584 0 34.368-.32 62.08-.32 70.496 0 6.88 4.608 14.88 17.6 12.352C438.72 472.145 512 375.857 512 262.353 512 120.401 397.376 5.329 255.968 5.329z"></path>
  </symbol>

  <symbol width="128px" height="128px" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="gitee">
      <g id="LOGO" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
          <g id="Artboard-7" transform="translate(-192.000000, -115.000000)" fill="#C71D23">
              <path d="M228,115 C247.882251,115 264,131.117749 264,151 C264,170.882251 247.882251,187 228,187 C208.117749,187 192,170.882251 192,151 C192,131.117749 208.117749,115 228,115 Z M246.223335,131 C246.222967,131 246.2226,131 246.222232,131.001102 L221.33326,131.001102 C213.969504,131.001102 208,136.970606 208,144.334362 L208,169.222232 C208,170.204066 208.795934,171 209.777768,171 L236.000329,171 C242.627564,171 248,165.627564 248,159.000329 L248,148.778425 C248,147.796591 247.204066,147.000657 246.222232,147.000657 L225.7779,147.000657 C224.796248,147.001123 224.000389,147.796773 223.999667,148.778425 L223.998503,153.222667 C223.997802,154.155409 224.715909,154.920565 225.629522,154.994969 L225.775805,155.00042 L225.775805,155.00042 L238.222276,155.000317 C239.155019,155.000295 239.919992,155.718618 239.994164,156.63225 L240.000044,156.77807 L240.000044,156.77807 L240.000044,157.666909 C240.000044,160.612411 237.612243,163.000213 234.66674,163.000213 L217.776621,163.000213 C216.794928,163.000164 215.999101,162.204358 215.999025,161.222665 L215.998559,144.334184 C215.998337,141.462319 218.268172,139.120556 221.111731,139.005187 L221.331716,139.00088 L221.331716,139.00088 L246.21727,139.00088 C247.198674,138.999777 247.994429,138.204515 247.996141,137.223112 L247.998897,132.77887 C248.000609,131.797037 247.205169,131.000609 246.223335,131 Z" id="logo_gitee_g_red"></path>
          </g>
      </g>
  </symbol>

  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" id="gitlab">
    <path d="M12.3 74.7h54L43.3 3c-1-3.6-6.4-3.6-7.6 0L12.3 74.8z" />
    <path d="M12.3 74.7L.5 111c-1 3.2 0 6.8 3 8.8l101.6 74-92.5-119z"/>
    <path d="M105 193.7l-38.6-119h-54l92.7 119z"/>
    <path d="M105 193.7l38.7-119H66.4l38.7 119z"/>
    <path d="M105 193.7l38.7-119H198l-93 119z"/>
    <path d="M198 74.7l11.6 36.2c1 3 0 6.6-3 8.6l-101.5 74 93-119z"/>
    <path d="M198 74.7h-54.3L167 3c1.2-3.6 6.4-3.6 7.6 0L198 74.8z"/>
  </symbol>
  <symbol viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" id="rss">
    <circle cx="3.429" cy="20.571" r="3.429"></circle>
    <path d="M11.429 24h4.57C15.999 15.179 8.821 8.001 0 8v4.572c6.302.001 11.429 5.126 11.429 11.428z"></path>
    <path d="M24 24C24 10.766 13.234 0 0 0v4.571c10.714 0 19.43 8.714 19.43 19.429z"></path>
  </symbol>
  <symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="linkedin">
    <path d="M437 0H75C33.648 0 0 33.648 0 75v362c0 41.352 33.648 75 75 75h362c41.352 0 75-33.648 75-75V75c0-41.352-33.648-75-75-75zM181 406h-60V196h60zm0-240h-60v-60h60zm210 240h-60V286c0-16.54-13.46-30-30-30s-30 13.46-30 30v120h-60V196h60v11.309C286.719 202.422 296.93 196 316 196c40.691.043 75 36.547 75 79.688zm0 0"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612" id="to-top">
    <path d="M604.501 440.509L325.398 134.956c-5.331-5.357-12.423-7.627-19.386-7.27-6.989-.357-14.056 1.913-19.387 7.27L7.499 440.509c-9.999 10.024-9.999 26.298 0 36.323s26.223 10.024 36.222 0l262.293-287.164L568.28 476.832c9.999 10.024 26.222 10.024 36.221 0 9.999-10.023 9.999-26.298 0-36.323z"></path>
  </symbol>
  <symbol viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" id="carly">
    <path d="M504.971 239.029L448 182.059V84c0-46.317-37.682-84-84-84h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c19.851 0 36 16.149 36 36v108c0 6.365 2.529 12.47 7.029 16.971L454.059 256l-47.029 47.029A24.002 24.002 0 0 0 400 320v108c0 19.851-16.149 36-36 36h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c46.318 0 84-37.683 84-84v-98.059l56.971-56.971c9.372-9.372 9.372-24.568 0-33.941zM112 192V84c0-19.851 16.149-36 36-36h44c13.255 0 24-10.745 24-24S205.255 0 192 0h-44c-46.318 0-84 37.683-84 84v98.059l-56.971 56.97c-9.373 9.373-9.373 24.568 0 33.941L64 329.941V428c0 46.317 37.682 84 84 84h44c13.255 0 24-10.745 24-24s-10.745-24-24-24h-44c-19.851 0-36-16.149-36-36V320c0-6.365-2.529-12.47-7.029-16.971L57.941 256l47.029-47.029A24.002 24.002 0 0 0 112 192z"></path>
  </symbol>
  <symbol viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" id="copy">
    <path d="M23 2.75A2.75 2.75 0 0 0 20.25 0H8.75A2.75 2.75 0 0 0 6 2.75v13.5A2.75 2.75 0 0 0 8.75 19h11.5A2.75 2.75 0 0 0 23 16.25zM18.25 14.5h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5zm0-3h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5zm0-3h-7.5a.75.75 0 0 1 0-1.5h7.5a.75.75 0 0 1 0 1.5z"></path>
    <path d="M8.75 20.5a4.255 4.255 0 0 1-4.25-4.25V2.75c0-.086.02-.166.025-.25H3.75A2.752 2.752 0 0 0 1 5.25v16A2.752 2.752 0 0 0 3.75 24h12a2.752 2.752 0 0 0 2.75-2.75v-.75z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512.001 512.001" id="closeme">
    <path d="M284.286 256.002L506.143 34.144c7.811-7.811 7.811-20.475 0-28.285-7.811-7.81-20.475-7.811-28.285 0L256 227.717 34.143 5.859c-7.811-7.811-20.475-7.811-28.285 0-7.81 7.811-7.811 20.475 0 28.285l221.857 221.857L5.858 477.859c-7.811 7.811-7.811 20.475 0 28.285a19.938 19.938 0 0 0 14.143 5.857 19.94 19.94 0 0 0 14.143-5.857L256 284.287l221.857 221.857c3.905 3.905 9.024 5.857 14.143 5.857s10.237-1.952 14.143-5.857c7.811-7.811 7.811-20.475 0-28.285L284.286 256.002z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" id="open-menu">
    <path d="M492 236H20c-11.046 0-20 8.954-20 20s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20zm0-160H20C8.954 76 0 84.954 0 96s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20zm0 320H20c-11.046 0-20 8.954-20 20s8.954 20 20 20h472c11.046 0 20-8.954 20-20s-8.954-20-20-20z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="instagram">
    <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id=youtube>
    <path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="stackoverflow">
    <path d="M21 27v-8h3v11H0V19h3v8h18z"></path><path d="M17.1.2L15 1.8l7.9 10.6 2.1-1.6L17.1.2zm3.7 14.7L10.6 6.4l1.7-2 10.2 8.5-1.7 2zM7.2 12.3l12 5.6 1.1-2.4-12-5.6-1.1 2.4zm-1.8 6.8l13.56 1.96.17-2.38-13.26-2.55-.47 2.97zM19 25H5v-3h14v3z"></path>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="xing">
    <path d="M18.188 0c-.517 0-.741.325-.927.66 0 0-7.455 13.224-7.702 13.657.015.024 4.919 9.023 4.919 9.023.17.308.436.66.967.66h3.454c.211 0 .375-.078.463-.22.089-.151.089-.346-.009-.536l-4.879-8.916c-.004-.006-.004-.016 0-.022L22.139.756c.095-.191.097-.387.006-.535C22.056.078 21.894 0 21.686 0h-3.498zM3.648 4.74c-.211 0-.385.074-.473.216-.09.149-.078.339.02.531l2.34 4.05c.004.01.004.016 0 .021L1.86 16.051c-.099.188-.093.381 0 .529.085.142.239.234.45.234h3.461c.518 0 .766-.348.945-.667l3.734-6.609-2.378-4.155c-.172-.315-.434-.659-.962-.659H3.648v.016z"/>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 55" id="discord">
    <path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z"/>
  </symbol>
  <symbol xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17 18" id="mastodon">
    <path
    fill="#ffffff"
    d="m 15.054695,9.8859583 c -0.22611,1.1632697 -2.02517,2.4363497 -4.09138,2.6830797 -1.0774504,0.12856 -2.1382704,0.24673 -3.2694704,0.19484 -1.84996,-0.0848 -3.30971,-0.44157 -3.30971,-0.44157 0,0.1801 0.0111,0.35157 0.0333,0.51194 0.24051,1.82571 1.81034,1.93508 3.29737,1.98607 1.50088,0.0514 2.8373104,-0.37004 2.8373104,-0.37004 l 0.0617,1.35686 c 0,0 -1.0498104,0.56374 -2.9199404,0.66742 -1.03124,0.0567 -2.3117,-0.0259 -3.80308,-0.42069 -3.23454998,-0.85613 -3.79081998,-4.304 -3.87592998,-7.8024197 -0.026,-1.03871 -0.01,-2.01815 -0.01,-2.83732 0,-3.57732 2.34385998,-4.62587996 2.34385998,-4.62587996 1.18184,-0.54277 3.20976,-0.77101 5.318,-0.7882499985409 h 0.0518 C 9.8267646,0.01719834 11.856025,0.24547834 13.037775,0.78824834 c 0,0 2.34377,1.04855996 2.34377,4.62587996 0,0 0.0294,2.63937 -0.32687,4.47183"/>
 <path
    fill="#000000"
    d="m 12.616925,5.6916583 v 4.3315297 h -1.71607 V 5.8189683 c 0,-0.88624 -0.37289,-1.33607 -1.1187604,-1.33607 -0.82467,0 -1.23799,0.53361 -1.23799,1.58875 v 2.30122 h -1.70594 v -2.30122 c 0,-1.05514 -0.4134,-1.58875 -1.23808,-1.58875 -0.74587,0 -1.11876,0.44983 -1.11876,1.33607 v 4.2042197 h -1.71607 V 5.6916583 c 0,-0.88527 0.22541,-1.58876 0.67817,-2.10922 0.46689,-0.52047 1.07833,-0.78727 1.83735,-0.78727 0.87816,0 1.54317,0.33752 1.98288,1.01267 l 0.42744,0.71655 0.42753,-0.71655 c 0.43961,-0.67515 1.10463,-1.01267 1.9828704,-1.01267 0.75893,0 1.37037,0.2668 1.83735,0.78727 0.45268,0.52046 0.67808,1.22395 0.67808,2.10922"/>
  </symbol>
</svg>

<footer class="footer">
  <div class="footer_inner wrap pale">
    <img src='https://kingdix10.gitee.io/icons/copy.svg' class="icon icon_2 transparent" alt="拾月国度">
    <p>Copyright&nbsp;2018-&nbsp;<span class="year"></span>&nbsp;拾月国度. All Rights Reserved</p><a class="to_top" href="#documentTop">
  <svg class="icon">
  <title>to-top</title>
  <use xlink:href="#to-top"></use>
</svg>

</a>

  </div>
</footer>

<script type="text/javascript" src="https://kingdix10.gitee.io/zh-cn/js/bundle.352f6b8ac853443fc909370d968a769ffa303b36042cc66849f2d48d9e5dd951ee86c06130908f5d77ea0e55ec8fed0e5dc26f0f14bbd4ad6dcf35999232e5bc.js" integrity="sha512-NS9rishTRD/JCTcNlop2n/owOzYELMZoSfLUjZ5d2VHuhsBhMJCPXXfqDlXsj&#43;0OXcJvDxS71K1tzzWZkjLlvA==" crossorigin="anonymous"></script>

  <script src="https://kingdix10.gitee.io/js/search.min.b19f217359693afb8f0abd75ca8de6becceec41f5304950fc48e165914ef227f44d10005d02a281a66e33b482e2ff27e6eb893111505deb4f072c307e1f887bb.js"></script>

  </body>
</html>
